package com.yc.spring.aop;


import com.yc.spring.bbs.dao.UserDao;
import com.yc.spring.bbs.dao.UserDaoImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//java 官方提供的代理方式  基于接口方式实现  被代理类必须实现接口
public class jdkProxy {

    public static Object proxy(Object bean){
        return   Proxy.newProxyInstance(
                //类加载器
                bean.getClass().getClassLoader(),
                //接口数组
                bean.getClass().getInterfaces(),
                //方法拦截器  匿名类
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy,//代理对象
                                         Method method, //拦截到的方法
                                         Object[] args  // 传入方法的参数
                    ) throws Throwable {
                        //执行业务方法
                        System.out.println("前置拦截  method = " + method);
                        Object ret = method.invoke(bean,args);
                        return ret;
                    }
                }
        );
    }


    public static void main(String[] args) {
        UserDao userDao = new UserDaoImpl();
        UserDao proxyBean = (UserDao) proxy(userDao);
        proxyBean.insert(null);
    }
}
